package com.victor.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class ClassFilter {

	/**
	 * 获取为null的字段
	 * 
	 * @param obj
	 * @return
	 * @throws Exception
	 */
	public static <T> List<String> isObjectFieldEmpty(T t) {
		Class<?> clazz = t.getClass(); // 得到类对象
		Field[] fs = clazz.getDeclaredFields(); // 得到属性集合
		List<String> list = new ArrayList<String>();
		for (Field field : fs) { // 遍历属性
			field.setAccessible(true); // 设置属性是可以访问的（私有的也可以）
			try {
				if (field.get(t) == null || "null".toUpperCase().equals(field.get(t))) {
					String name = (String) field.getName();
					list.add(name);
				}
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		}
		return list;
	}

	/**
	 * 获取不为null的字段
	 * 
	 * @param obj
	 * @return
	 * @throws Exception
	 */
	public static <T> List<String> isObjectFieldNotEmpty(T t) {
		Class<?> clazz = t.getClass(); // 得到类对象
		Field[] fs = clazz.getDeclaredFields(); // 得到属性集合
		List<String> list = new ArrayList<String>();
		for (Field field : fs) { // 遍历属性
			field.setAccessible(true); // 设置属性是可以访问的（私有的也可以）
			try {
				if (field.get(t) != null) {
					String name = (String) field.getName();
					list.add(name);
				}
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		}
		return list;
	}

	/**
	 * 获取传入属性中不为null的字段
	 * 
	 * @param t
	 * @param fieldColumns
	 * @return
	 */
	public static <T> List<String> isObjectFieldNotEmpty(T t, String[] fieldColumns) {
		Class<?> clazz = t.getClass(); // 得到类对象
		Field[] fs = clazz.getDeclaredFields(); // 得到属性集合
		List<String> list = new ArrayList<String>();
		for (Field field : fs) { // 遍历属性
			field.setAccessible(true); // 设置属性是可以访问的（私有的也可以）
			String name = (String) field.getName();
			for (String temp : fieldColumns) {
				if (temp.equals(name)) {
					try {
						if (field.get(t) != null) {
							list.add(name);
						}
					} catch (IllegalArgumentException e) {
						e.printStackTrace();
					} catch (IllegalAccessException e) {
						e.printStackTrace();
					}
				}
			}
		}
		return list;
	}

	/**
	 * 获取传入属性中为null的字段
	 * 
	 * @param t
	 * @param fieldColumns
	 * @return
	 */
	public static <T> List<String> isObjectFieldEmpty(T t, String[] fieldColumns) {
		Class<?> clazz = t.getClass(); // 得到类对象
		Field[] fs = clazz.getDeclaredFields(); // 得到属性集合
		List<String> list = new ArrayList<String>();
		for (Field field : fs) { // 遍历属性
			field.setAccessible(true); // 设置属性是可以访问的（私有的也可以）
			String name = (String) field.getName();
			for (String temp : fieldColumns) {
				if (temp.equals(name)) {
					try {
						if (field.get(t) == null) {
							list.add(name);
						}
					} catch (IllegalArgumentException e) {
						e.printStackTrace();
					} catch (IllegalAccessException e) {
						e.printStackTrace();
					}
				}
			}
		}
		return list;
	}

	/**
	 * 判断传入的字段中有null
	 * 
	 * @param t
	 * @param fieldColumns
	 * @return
	 */
	public static <T> boolean somePropertyIsEmpty(T t, String[] fieldColumns) {
		Class<?> clazz = t.getClass();
		for (int i = 0; i < fieldColumns.length; i++) {
			String fieldName = fieldColumns[i];
			String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
			try {
				Method getMethod;
				getMethod = clazz.getMethod(getMethodName, new Class[] {});
				Object value = getMethod.invoke(t, new Object[] {});
				if (value == null || String.valueOf(value).isEmpty()) {
					return true;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return false;
	}

	/**
	 * 判断传入的字段中没有null
	 * 
	 * @param t
	 * @param fieldColumns
	 * @return
	 */
	public static <T> boolean somePropertyNotEmpty(T t, String[] fieldColumns) {
		Class<?> clazz = t.getClass();
		for (int i = 0; i < fieldColumns.length; i++) {
			String fieldName = fieldColumns[i];
			String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
			try {
				Method getMethod;
				getMethod = clazz.getMethod(getMethodName, new Class[] {});
				Object value = getMethod.invoke(t, new Object[] {});
				if (value == null || String.valueOf(value).isEmpty()) {
					return false;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return true;
	}

}
